package com.tuling.stu.base;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


public class JedisPoolUtil {
	
	private static JedisPool pool = null;
	
	private String host;
	private Integer port;
	private String pwd;
	private Integer timeout;
	
	/**
	 * @param host the host to set
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * @param port the port to set
	 */
	public void setPort(Integer port) {
		this.port = port;
	}

	/**
	 * @param pwd the pwd to set
	 */
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	/**
	 * @param timeout the timeout to set
	 */
	public void setTimeout(Integer timeout) {
		this.timeout = timeout;
	}

	/**
	 * 单例模型，获取redis连接
	 * /cloud_common_soa/src/main/resources/common-singleton.xml
	 * @throws Exception
	 */
	public void init() throws Exception{
				
		JedisPoolConfig config = new JedisPoolConfig();
		// 是否启用pool的jmx管理功能, 默认true
		config.setJmxEnabled(true);

		// 是否启用后进先出, 默认true
		config.setLifo(true);

		// 最大连接数, 默认8个
		config.setMaxTotal(100);

		// 最小空闲连接数, 默认0
		config.setMinIdle(0);

		// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
		config.setMaxIdle(300);
		
		// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,
		// 默认-1
		config.setMaxWaitMillis(-1);

		// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
		config.setMinEvictableIdleTimeMillis(1800000);

		// 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
		config.setNumTestsPerEvictionRun(3);

		// 对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数
		// 时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略)
		config.setSoftMinEvictableIdleTimeMillis(1800000);

		// 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
		config.setTimeBetweenEvictionRunsMillis(-1);

		// 在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
		config.setTestOnBorrow(true);
		
		//是否设置了密码
		if (!"".equals(pwd)) {
			pool = new JedisPool(config, host, port, timeout,pwd);
		}else {
			pool = new JedisPool(config, host, port, timeout);
		}
	}
	
	/**
	 * 获取连接
	 * 
	 * @param redis
	 */
	public Jedis getResource() {
		return pool.getResource();
	}
	
	/**
	 * 返还到连接池（正常释放连接）
	 * 
	 * @param redis
	 */
	@SuppressWarnings("deprecation")
	public void returnResource(Jedis jedis) {
		if (jedis != null) {
			pool.returnResource(jedis);
		}
	}
	
	/**
	 * 遇到异常时释放对象（比如：连接超时）
	 * 
	 * @param redis
	 */
	@SuppressWarnings("deprecation")
	public void returnBrokenResource(Jedis jedis) {
		if (jedis != null) {
			pool.returnBrokenResource(jedis);
		}
	}
	
}
